package com.meterhuang;

import lombok.extern.slf4j.Slf4j;

/**
 * 冒泡排序
 *
 * @author meterhuang
 * @date 2021/04/06 16:08
 */
@Slf4j
public class BubbleSort {

	public static void main(String[] args) {
		log.info("start bubble.");
		int[] sortArr = bubble(new int[]{11, 7, 5, 4, 3, 2, 1, 1, 0});
		log.info("end bubble.");
		log.info("sort array: {}", sortArr);
		log.info("start bubbleV2.");
		int[] sortArrV2 = bubbleV2(new int[]{11, 7, 5, 4, 3, 2, 1, 1, 0});
		log.info("end bubbleV2.");
		log.info("sort array2: {}", sortArrV2);
	}

	private static int[] bubble(int[] nums) {
		// 外循环表示几轮比较
		for (int i = 0; i < nums.length - 1; ++i) {
			// 内循环在每轮比较过程中排序
			for (int j = 0; j < nums.length - i - 1; ++j) {
				if (nums[j] < nums[j + 1]) {
					int temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
				}
			}
		}
		return nums;
	}

	/**
	 * 优化排序次数，如果某一轮比较中没有发生一次移位操作，则后续已经有序，直接退出
	 * @param nums
	 * @return
	 */
	private static int[] bubbleV2(int[] nums) {
		// 外循环表示几轮比较
		boolean flag = false;
		for (int i = 0; i < nums.length - 1; ++i) {
			if (flag) {
				break;
			}
			flag = true;
			// 内循环在每轮比较过程中排序
			for (int j = 0; j < nums.length - i - 1; ++j) {
				if (nums[j] < nums[j + 1]) {
					int temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
					flag = false;
				}
			}
		}
		return nums;
	}

}
